package com.example.service.other;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

import static com.example.entity.constant.redis.SeckillConstant.TOKEN_KEY_PREFIX;

@Service
public class TokenService {

    @Autowired
    private StringRedisTemplate redisTemplate;

    /**
     * 预热令牌：为商品生成与库存数量相等的令牌
     * @param goodsId 商品ID
     * @param stock 库存数量
     */
    public void preGenerateTokens(Long goodsId, int stock) {
        String tokenKey = TOKEN_KEY_PREFIX + goodsId;
        // 清空历史数据
        redisTemplate.delete(tokenKey);

        // 批量生成令牌
        List<String> tokens = new ArrayList<>(stock);
        for (int i = 0; i < stock; i++) {
            tokens.add(UUID.randomUUID().toString());
        }

        // 批量存入Redis集合
        redisTemplate.opsForSet().add(tokenKey, tokens.toArray(new String[0]));
    }

    /**
     * 获取令牌（原子操作）
     * @param goodsId 商品ID
     * @return 令牌字符串，如果没有可用令牌则返回null
     */
    public String acquireToken(Long goodsId) {
        String tokenKey = TOKEN_KEY_PREFIX + goodsId;
        return redisTemplate.opsForSet().pop(tokenKey);
    }
}
